/**
 * 在数学和计算机科学中，柯里化是一种将多个参数的一个函数转换成
 * 一系列一个参数的函数
 */

// function foo(a, b, c) {
//   return [a, b, c];
// }
// function currying(fn, ...args) {
//   if (args.length >= fn.length) {
//     return fn(...args);
//   } else {
//     return (...args2) => currying(fn, ...args, ...args2);
//   }
// }
// const curryingFun = currying(foo, 1);
// console.log(curryingFun(2)(3));

// function getUrl(protocol, domain, path) {
//   return protocol + "://" + domain + "/" + path;
// }

// var page1 = getUrl('http', 'www.conardli.top', 'page1.html');
// var page2 = getUrl('http', 'www.conardli.top', 'page2.html');

// 柯里化后

// function simpleURL(a, b, c) {
//   return `${a}://${b}/${c}`;
// }

// function currying(fn, ...args) {
//   if (args.length >= fn.length) {
//     return fn(...args);
//   } else {
//     return (...args2) => currying(fn, ...args, ...args2);
//   }
// }

// let conardliSite = currying(simpleURL)("http", "www.conardli.top");
// let page1 = conardliSite("page1.html");

// console.log(page1);


function curry(fn) {
  const params = [];
  return function(num) {
    params.push(num);
    return fn(...params);
  }
}

function sum() {
  return [...arguments].reduce((pre, i) => {
    return pre+=i
  }, 0)
}

const fn = curry(sum)

console.log(fn(1)(2)(3))